// 重载
// 普通重载
// JavaScript本身是个动态语言 JavaScript里函数
// 根据传入不同的参数而返会不同类型的数据是很常见的
// pickCard方法根据传入参数的不同会返回俩种不同的类型
// 如果传入的是代表纸牌的对象, 函数作用是从中抓一张牌
// 如果用户想抓拍牌,我们告诉他抓到了什么牌

let suits = ["hearts","spdes","clubs","diamonds"];
// 函数返回值可以是任何类型
function pickCard(x):any{
    if(typeof x=="object"){
        let pickedCard = Math.floor(Math.random()*x.length);
        return pickedCard
    }else if(typeof x=='number'){
        let pickedSuit = Math.floor(x / 13);
        return {suit:suits[pickedSuit],card:x % 1};
    }
}
let myDeck = [
    {suit:"diamonds",card:2},
    {suit:"spades",card:10},
    {suit:"hearts",card:4}
]
let pickedCard1 = myDeck[pickCard(myDeck)];
console.log("card: "+pickedCard1.card + " of " + pickedCard1.suit);
let pickedCard2 = pickCard(15);
console.log("card: "+pickedCard2.card + " of " + pickedCard2.suit);

// Typescript 基于类型系统的函数重载实现
// 方法是为同一个函数提供多个函数类型定义来进行函数重载
// 编译器会根据这个列表去处理函数的调用
// 面我们来重载pickCard函数

// 简单来说就是通过多重类型定义来预设多种允许的参数和返回值
// 从而实现存在的类型判断

// 注意, function pickCard(x):any并不是重载列表的一部分,
// 因此这里只有两个重载: 一个是接收对象另一个是接受数字
// 以其他参数调用pickCard会产生错误

let suits2 = ["hearts","spades","clubs","diamnds"];

// 入股噢传入函数的1承诺书格式是一个数组,
// 且每个数组都是一个里面由suit和card属性的对象时,
// 返回值是数字
function pickCard2(x:{suit:string;card:number;}[]):number;

// 如果传入函数的参数格式是一个数字,则返回一个对象,对象里面由suit和card属性
function pickCard2(x:number):{suit:string;card:string;};

// 此处函数不可变,下次串案是会自动调用上面的接口设置
function pickCard2(x):any{
    if(typeof x == "object"){
        let pickedCard = Math.floor(Math.random() * x.length );
        return pickedCard;
    }else if(typeof x == 'number'){
        let pickedSuit = Math.floor(x/13);
        return {suit:suits2[pickedSuit],card: x % 13};
    }
}
let myDeck2 = [
    {suit:"diamonds",card:2},
    {suit:"spades",card:10},
    {suit:"hearts",card:4}
];
// 此处要是属性名称错误,则直接报错
let pickedCard3 = myDeck2[pickCard2(myDeck2)];
console.log("card:  "+pickedCard3.card + " of " + pickedCard3.suit);

let pickedCard4 = pickCard2(15);
// 此处要是传入的是字符串或是其他的也会直接报错
console.log("card: "+ pickedCard4.card + " of " + pickedCard4.suit);







